#ifndef AUDITLOGGER_H
#define AUDITLOGGER_H

#include <QObject>
#include <QDateTime>
#include <QString>
#include <QVector>
#include <QMetaType>
#include <QSqlDatabase>
#include <QJsonDocument>  // 添加QJsonDocument头文件包含
#include "AuditEntry.h"  // 添加审计条目头文件包含

class AuditLogger : public QObject
{
    Q_OBJECT
public:
    // 审计动作枚举
    enum ActionType {
        System = 0,  // 系统操作
        Create,      // 创建记录
        Read,        // 读取记录
        Update,      // 更新记录
        Delete,      // 删除记录
        Login,       // 用户登录
        Logout       // 用户登出
    };
    Q_ENUM(ActionType)

    // 审计记录结构
    struct AuditRecord {
        QDateTime timestamp;    // 操作时间
        QString userId;         // 用户ID
        ActionType action;      // 操作类型
        QString tableName;      // 表名
        QString recordId;       // 记录ID
        QString oldValue;       // 旧值
        QString newValue;       // 新值
        QString description;    // 描述
    };

    explicit AuditLogger(QObject *parent = nullptr);
    ~AuditLogger();

    // 初始化数据库连接
    bool initialize(const QString &dbPath, const QString &password);

    // 记录审计日志
    bool logEvent(const AuditRecord &record);

    // 查询审计日志
    // 查询审计日志
    QVector<AuditRecord> queryEvents(const QString &userId = QString(),
                                    const QDateTime &from = QDateTime(),
                                    const QDateTime &to = QDateTime(),
                                    ActionType action = ActionType::System) const;
    
    // 获取审计记录 (QML接口兼容方法)
    QList<AuditRecord> getAuditRecords(const QDateTime &from = QDateTime(),
                                      const QDateTime &to = QDateTime(),
                                      const QString &userId = QString(),
                                      const QString &action = QString()) const;

    // 记录审计动作
    void logAction(ActionType action, const QString &details);
    
    // 将枚举转换为字符串
    static QString actionToString(ActionType action);

    QString getDatabasePath() const;
    QString getEncryptionPassword() const;

public:  // 在public区域添加方法声明
    void logEntry(const AuditEntry& entry);

private:
    // 添加私有成员初始化标志
    bool m_initialized = false;
    
    // 添加私有方法声明
    static int actionStringToEnum(const QString& action);

    QSqlDatabase m_db;
    // 新增私有成员变量声明
    private:
        QString m_dbPath;
        QString m_encryptionPassword;
        QString m_connectionName;
    QVector<AuditRecord> m_records; // 审计记录存储

    // 修改方法声明添加异常规范
    bool createTables() noexcept;
};

// 注册元类型
Q_DECLARE_METATYPE(AuditLogger::ActionType)

#endif // AUDITLOGGER_H